﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace KioskosJugandoLimpio.Classes
{
    public class Pregunta
    {
        public int idPreguntas;
        public string pregunta;
        public int numero;
        public Seccion seccion;
        public List<Opcion> Opciones;
        public string ControlDefault;
        public RadioButtonList radios;
        public CheckBoxList checks;
        public int tipoPregunta;

        public string idPreguntaOculta;
        public string idOpcionActiva;
        public string visible;


        public Pregunta(int idPreguntas, string pregunta, int numero, string ControlDefault, int tipoPregunta, string idPreguntaOculta, string idOpcionActiva, string visible, Seccion seccion)
        {
            // TODO: Complete member initialization
            this.tipoPregunta = tipoPregunta;
            this.idPreguntas = idPreguntas;
            this.pregunta = pregunta;
            this.numero = numero;

            this.idPreguntaOculta = idPreguntaOculta;
            this.idOpcionActiva = idOpcionActiva;
            this.visible = visible;            

            this.ControlDefault = ControlDefault;
            this.seccion = seccion;
            DataTable t = SQL.fnDataTable(string.Format("EXEC opcionesPorPregunta {0}" , idPreguntas));
            Opciones = new List<Opcion>();
            foreach (DataRow row in t.Rows) {
                Opciones.Add(new Opcion(int.Parse(row["idOpciones"].ToString()), row["Opcion"].ToString(), row["Valor"].ToString(), this));
            }
            radios = new RadioButtonList();
            radios.ClientIDMode = ClientIDMode.Static;
            radios.ID = this.idPreguntas.ToString();
            radios.RepeatDirection = RepeatDirection.Horizontal;
            checks = new CheckBoxList();
            checks.ClientIDMode = ClientIDMode.Static;
            checks.ID = this.idPreguntas.ToString();
            checks.RepeatDirection = RepeatDirection.Horizontal;
        }

        public Pregunta(int idPreguntas)
        {
            // TODO: Complete member initialization
            this.idPreguntas = idPreguntas;
            this.ControlDefault = "text";
            this.tipoPregunta = -1;
            Opciones = new List<Opcion>();
        }


        public Control control { get {
            if (this.seccion.Encuesta.mode == Modes.Edit) {
                return controlEdit;
            }
            Label ctl = new Label();
            ctl.Controls.Add(lblPregunta);
            switch( ControlDefault ){
                case "checkbox":
                    foreach (Opcion opcion in Opciones)
                    {
                        checks.Items.Add(opcion.listItem);
                    }
                    ctl.Controls.Add(checks);
                    break;
                case "radio":
                    foreach (Opcion opcion in Opciones)
                    {
                        ListItem litem = opcion.listItem;                        
                        if (opcion.pregunta.idPreguntaOculta.Length > 0)
                        {
                            if (opcion.idOpciones == int.Parse(opcion.pregunta.idOpcionActiva))
                            {
                                litem.Attributes.Add("onclick", string.Format("visiblePregunta({0}, 1);", opcion.pregunta.idPreguntaOculta));
                            }
                            else
                            {
                                litem.Attributes.Add("onclick", string.Format("visiblePregunta({0}, 0);", opcion.pregunta.idPreguntaOculta));
                            }
                        }

                        litem.Attributes.Add("class", "hrRadio");

                        radios.Items.Add(litem);
                    }
                    ctl.Controls.Add(radios);
                    break;
                case "select":
                    DropDownList drop = new DropDownList();
                    drop.ID = idPreguntas.ToString();
                    drop.ClientIDMode = ClientIDMode.Static;
                    foreach (Opcion opcion in Opciones)
                    {
                        drop.Items.Add(opcion.listItem);
                    }
                    ctl.Controls.Add(drop);
                    break;
                default:
                    foreach (Opcion opcion in Opciones)
                    {
                        ctl.Controls.Add(opcion.control);
                    }
                    break;
            }
            ctl.CssClass = "pregunta";
            ctl.Attributes.Add("id", this.idPreguntas.ToString());
            ctl.Attributes.Add("validar",this.ControlDefault );
            if (ControlDefault == "text") {
                TextBox txbBox = new TextBox() { ID = this.idPreguntas.ToString(), ClientIDMode = ClientIDMode.Static };
                //if (int.Parse(this.visible) == 0)
                //{
                //    txbBox.Text = "NO";
                //}
                ctl.Controls.Add(txbBox);
            }
            if (ControlDefault == "rango")
            {
                TextBox t = new TextBox() { ID = this.idPreguntas.ToString(), ClientIDMode = ClientIDMode.Static };
                t.CssClass = "num";
                ctl.Controls.Add(t);
            }

            if (int.Parse(this.visible) == 0)
            {
                ctl.Style.Add("display", "none");
            }

            return ctl;
        }
        }

        public Control lblPregunta { get {
            Label l = new Label();
            l.Text = pregunta;
            l.CssClass = "pregunta";
            return l;
        } }

        public Control controlEdit
        {
            get
            {
                Label ctl = new Label();
                ctl.CssClass="preguntaEdit";
                Label lblpregunta = new Label();
                lblpregunta.CssClass = "pregunta";
                lblpregunta.Text = "Pregunta";
                ctl.Controls.Add(lblpregunta);
                ctl.Controls.Add(inputPregunta);
                DropDownList cmbTiposPreguntas = new DropDownList();
                string pid = idPreguntas >0 ? idPreguntas.ToString():Guid.NewGuid().ToString("N");
                cmbTiposPreguntas.ID = "__cmbOption";
                cmbTiposPreguntas.Attributes.Add("onchange",string.Format("fnOptions('{0}')",pid));
                DataTable dt = SQL.fnDataTable("EXEC obtenerTiposPreguntas");
                foreach (DataRow row in dt.Rows) {
                    ListItem tp = new ListItem(row["TipoPregunta"].ToString(), row["idTiposPreguntas"].ToString());
                    if (int.Parse(row["idTiposPreguntas"].ToString()) == this.tipoPregunta || (tipoPregunta == -1 && row["ControlDefault"].ToString()=="text"))
                    {
                        tp.Selected = true;
                    }
                    cmbTiposPreguntas.Items.Add(tp);
                }
                Label lblTipo = new Label();
                lblTipo.CssClass = "pregunta";
                lblTipo.Text = "Tipo de pregunta";
                ctl.Controls.Add(lblTipo);
                ctl.Controls.Add(cmbTiposPreguntas);
                Label lblOpciones = new Label();
                lblOpciones.CssClass = "pregunta";
                Label optionsContainer = new Label();
                optionsContainer.ID = "__Qoptions";
                optionsContainer.ClientIDMode = ClientIDMode.Static;
                if (this.ControlDefault != "text")
                {
                    lblOpciones.Text = "Opciones";
                    optionsContainer.Controls.Add(lblOpciones);
                    foreach (Opcion opcion in Opciones)
                    {
                        optionsContainer.Controls.Add(opcion.input);
                    }
                    LinkButton addBtn = new LinkButton();
                    addBtn.OnClientClick = (string.Format("return fnAddOption('{0}');", this.idPreguntas));
                    addBtn.Text = "[+]";
                    optionsContainer.Controls.Add(addBtn);
                }
                else
                {
                    optionsContainer.Text = "Este tipo de pregunta no necesita opciones.";
                }
                ctl.Controls.Add(optionsContainer);
                ctl.ID = "__pregunta_"+this.idPreguntas.ToString();
                ctl.ClientIDMode = ClientIDMode.Static;
                return ctl;
            }
        }

        public Control inputPregunta
        {
            get
            {
                TextBox l = new TextBox();
                l.Text = pregunta;
                l.ClientIDMode = ClientIDMode.Static;
                l.ID="__textoPregunta_";
                l.CssClass = "pregunta";
                return l;
            }
        }


        internal void guardar(System.Data.SqlClient.SqlTransaction tran)
        {
            if (this.idPreguntas == -1)
            {
                this.idPreguntas = SQL.fnExec(string.Format("EXEC guardarPregunta {0},{1},{2},{3}, {4}, '{5}', {6},{7}", this.idPreguntas,this.seccion.Encuesta.idEncuestas, 0,0,0, this.pregunta, this.seccion.idSecciones,this.tipoPregunta), tran);
            }
            else {
                SQL.fnExec(string.Format("EXEC guardarPregunta {0},{1},{2},{3}, {4}, '{5}', {6},{7}", this.idPreguntas, this.seccion.Encuesta.idEncuestas, 0, 0, 0, this.pregunta, this.seccion.idSecciones, this.tipoPregunta), tran);
            }
            DataTable t = SQL.fnDataTable(string.Format("EXEC opcionesPorPregunta {0}", idPreguntas));
            foreach (DataRow row in t.Rows)
            {
                bool deleted = true;
                foreach( Opcion opcion in Opciones ){
                    if (opcion.idOpciones.ToString().Equals(row["idOpciones"].ToString())) {
                        deleted = false;
                    }
                }
                if (deleted) {
                    SQL.fnExec(string.Format("EXEC borrarOpcionesPreguntas {0},{1}", row["idOpciones"].ToString(),this.idPreguntas), tran);
                }
            }

            foreach (Opcion opcion in this.Opciones) {
                opcion.guardar(tran);
            }

        }
    }
}
